package net.hn.hnms.biz.analysis.utils;

public class GasRuleUtil {

    /**
     * 瓦斯浓度
     *
     * @param gasConcentration
     * @return
     */
    public static int getGasConcentration(Float gasConcentration) {
        int result = 0;
        if (gasConcentration != null) {
            if (gasConcentration < 1) {
                result = 1;
            }
        }
        return result * 100;
    }


    /**
     * 计算受教育文化程度得分
     *
     * @param educationPercent 教育百分比（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getEducationLevelScores(float educationPercent) {
        float result = 0.0f;

        if (educationPercent > 50 && educationPercent <= 90) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((educationPercent - 50) / 40);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (educationPercent > 90) {
            result = 1.0f;
        }

        return 100 * result;
    }

    /**
     * 计算平均年龄得分
     *
     * @param averageAge 平均年龄（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getAverageScores(float averageAge) {
        float result = 0.0f;

        if (averageAge > 22 && averageAge < 38) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((averageAge - 22) / 16);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (averageAge >= 38 && averageAge < 45) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((45 - averageAge) / 7);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (averageAge > 45) {
            result = 0.0f;
        }

        return 100 * result;
    }

    /**
     * 计算人员培训情况得分
     *
     * @param trainingPercent 培训百分比（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getStaffTrainingScores(float trainingPercent) {
        float result = 0.0f;

        if (trainingPercent > 95 && trainingPercent < 100) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((trainingPercent - 95) / 5);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (trainingPercent == 100) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算安全培训时间合格率得分
     *
     * @param trainingPercent 培训百分比（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getSafetyTrainingPercent(float trainingPercent) {
        float result = 0.0f;

        if (trainingPercent > 95 && trainingPercent < 100) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((trainingPercent - 95) / 5);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (trainingPercent == 100) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算超员情况得分
     *
     * @param overStaff 是否超员（整数，0 表示未超员，1 表示超员）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getOverStaffScores(int overStaff) {
        float result = 1.0f;

        if (overStaff == 1) {
            result = 0.0f;
        }

        return 100 * result;
    }

    /**
     * 计算管理人员专业配备得分
     *
     * @param isReady 是否配备齐全（整数，0 表示未配备，1 表示配备）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getManagementEquipScores(int isReady) {
        float result = 0.0f;

        if (isReady == 1) {
            result = 1.0f;
        }

        return 100 * result;
    }


    /**
     * 计算领导带班异常得分
     *
     * @param onDuty 是否在岗（整数，0 表示未在岗，1 表示在岗）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getLeaderDutyScores(int onDuty) {
        float result = 1.0f;

        if (onDuty == 0) {
            result = 0.0f;
        }

        return 100 * result;
    }

    /**
     * 计算采掘机械水平得分
     *
     * @param mechanicasLevel 采掘机械水平（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getMiningMechanicalsLevelScores(float mechanicasLevel) {
        float result = 0.0f;

        if (mechanicasLevel > 80 && mechanicasLevel < 95) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((mechanicasLevel - 80) / 15);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (mechanicasLevel >= 95) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算系统运转中断情况得分
     *
     * @param isInterruption 是否中断（整数，0 表示中断，1 表示未中断）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getSystemInterruptionScores(int isInterruption) {
        float result = 1.0f;

        if (isInterruption == 0) {
            result = 0.0f;
        }

        return result * 100;
    }

    /**
     * 计算防隔爆设施情况得分
     *
     * @param noProofPercent 未设置防隔爆设施百分比（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getExplosionProofFacilities(float noProofPercent) {
        float result = 0.0f;

        if (noProofPercent > 5 && noProofPercent < 10) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((10 - noProofPercent) / 5);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (noProofPercent <= 5) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算电器设备失爆率得分
     *
     * @param explosionPercent 失爆率（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getElectricalExplosionPercentScores(float explosionPercent) {
        float result = 0.0f;

        if (explosionPercent > 5 && explosionPercent < 10) {
            // 使用 Math.round 四舍五入到小数点后 4 位
            result = ((10 - explosionPercent) / 5);
            result = Math.round(result * 10000) / 10000.0f; // 保留 4 位小数
        } else if (explosionPercent <= 5) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算局部通风机开停得分
     *
     * @param isOn 是否开启（整数，0 表示关闭，1 表示开启）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getLocalVentilatorOnAndOff(int isOn) {
        float result = 1.0f;

        if (isOn == 0) {
            result = 0.0f;
        }

        return result * 100;
    }

    /**
     * 计算风电瓦斯电闭锁得分
     *
     * @param isLock 是否闭锁（整数，0 表示未闭锁，1 表示闭锁）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getWindGasElectricalLock(int isLock) {
        float result = 0.0f;

        if (isLock == 1) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算传感器按时标校情况得分
     *
     * @param isReady 是否按时标校（整数，0 表示未按时标校，1 表示按时标校）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getSensorCalibrationStatus(int isReady) {
        float result = 0.0f;

        if (isReady == 1) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯地质条件得分
     *
     * @param conditions 瓦斯地质条件（整数，1 表示简单，2 表示中等，3 表示复杂，4 表示极复杂）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasGeologicalConditions(int conditions) {
        float result = 0.0f;

        switch (conditions) {
            case 1:
                result = 1.0f;
                break;
            case 2:
                result = 0.85f;
                break;
            case 3:
                result = 0.75f;
                break;
            case 4:
                result = 0.59f;
                break;
            default:
                // 如果传入无效值，默认返回 0
                result = 0.0f;
                break;
        }

        return result * 100;
    }

    /**
     * 计算氧气浓度得分
     *
     * @param oxygenConcentration 氧气浓度（浮点数，可以为 null）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getOxygenConcentration(Float oxygenConcentration) {
        float result = 0.0f;

        // 检查是否为 null
        if (oxygenConcentration == null) {
            result = 0.0f;
        } else {
            // 如果氧气浓度大于等于 0.2，则返回 100
            if (oxygenConcentration >= 0.2f) {
                result = 1.0f;
            }
        }

        return result * 100;
    }

    /**
     * 计算巷道风速得分
     *
     * @param windSpeed 巷道风速（浮点数，可以为 null）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getRoadwayWindSpeed(Float windSpeed) {
        float result = 0.0f;

        // 检查是否为 null
        if (windSpeed == null) {
            result = 0.0f;
        }
        // 如果风速小于 0.5
        else if (windSpeed < 0.5f) {
            float temp = 0.97f * (windSpeed - 0.4f);
            result = (float) Math.round(Math.exp(temp) * 10000) / 10000; // 四舍五入到小数点后 4 位
        }
        // 如果风速在 [0.5, 3] 范围内
        else if (windSpeed >= 0.5f && windSpeed <= 3.0f) {
            result = 1.0f;
        }
        // 如果风速大于 3
        else {
            float temp = -0.006f * (windSpeed - 3.0f);
            result = (float) Math.round(Math.exp(temp) * 10000) / 10000; // 四舍五入到小数点后 4 位
        }

        return result * 100;
    }

    /**
     * 计算煤层透气性得分
     *
     * @param permeability 煤层透气性（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getCoalSeamPermeability(float permeability) {
        float result = 0.0f;

        // 如果透气性在 (5, 30) 范围内
        if (permeability > 5 && permeability < 30) {
            result = ((permeability - 5) / 25);
            result = Math.round(result * 10000) / 10000.0f; // 四舍五入到小数点后 4 位
        }
        // 如果透气性大于等于 30
        else if (permeability >= 30) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯相对涌出量得分
     *
     * @param mineType 矿井类型（整数，1 表示煤与瓦斯突出矿井，2 表示高瓦斯矿井，3 表示瓦斯矿井）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasRelativeOutflowScores(int mineType) {
        float result = 0.0f;
        switch (mineType) {
            case 1: // 煤与瓦斯突出矿井
                result = 0.7f;
                break;
            case 2: // 高瓦斯矿井
                result = 0.75f;
                break;
            case 3: // 瓦斯矿井
                result = 1.0f;
                break;
            default:
                // 如果传入无效值，默认返回 0
                result = 0.0f;
                break;
        }
        return result * 100;
    }

    /**
     * 计算煤层倾角得分
     *
     * @param angle 煤层倾角（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getCoalSeamAngleScores(float angle) {
        float result = 0.0f;

        // 如果倾角在 (8, 45) 范围内
        if (angle > 8 && angle < 45) {
            result = (45 - angle) / 37;
            result = Math.round(result * 10000) / 10000.0f; // 四舍五入到小数点后 4 位
        }
        // 如果倾角小于等于 8
        else if (angle <= 8) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算煤层厚度变异性系数得分
     *
     * @param variationCofficient 煤层厚度变异性系数（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getCoalSeamThicknessVariationCofficientScores(float variationCofficient) {
        float result = 0.0f;

        // 如果变异性系数在 (0.2, 0.5) 范围内
        if (variationCofficient > 0.2f && variationCofficient < 0.5f) {
            result = (0.5f - variationCofficient) / 0.3f;
            result = Math.round(result * 10000) / 10000.0f; // 四舍五入到小数点后 4 位
        }
        // 如果变异性系数小于等于 0.2
        else if (variationCofficient <= 0.2f) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算煤层埋深得分
     *
     * @param depth 煤层埋深（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getCoalSeamDepthScores(float depth) {
        float result = 0.0f;

        // 如果埋深在 (200, 500) 范围内
        if (depth > 200 && depth < 500) {
            result = (500 - depth) / 300;
            result = Math.round(result * 10000) / 10000.0f; // 四舍五入到小数点后 4 位
        }
        // 如果埋深小于等于 200
        else if (depth <= 200) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算煤的坚固性系数得分
     *
     * @param solidityCoefficient 煤的坚固性系数（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getCoalSolidityCoefficientScores(float solidityCoefficient) {
        float result = 0.0f;

        // 如果坚固性系数大于 0.3，则返回 100
        if (solidityCoefficient > 0.3f) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯压力得分
     *
     * @param gasPressure 瓦斯压力（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasPressureScores(float gasPressure) {
        float result = 0.0f;

        // 如果瓦斯压力小于 0.74，则返回 100
        if (gasPressure < 0.74f) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯含量得分
     *
     * @param gasContent 瓦斯含量（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasContentScores(float gasContent) {
        float result = 0.0f;

        // 如果瓦斯含量小于 8，则返回 100
        if (gasContent < 8.0f) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算顶底板稳定性得分
     *
     * @param stability 顶底板稳定性（浮点数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getRoofAndFloorStabilityScores(float stability) {
        float result = 0.0f;

        // 如果稳定性在 (80, 95) 范围内
        if (stability > 80 && stability < 95) {
            result = (stability - 80) / 15;
            result = Math.round(result * 10000) / 10000.0f; // 四舍五入到小数点后 4 位
        }
        // 如果稳定性大于等于 95
        else if (stability >= 95) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算矿井瓦斯等级得分
     *
     * @param gasLevel 矿井瓦斯等级（整数，1 表示煤与瓦斯突出矿井，2 表示高瓦斯矿井，3 表示瓦斯矿井）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getMineGasLevelScores(int gasLevel) {
        float result = 0.0f;

        // 根据瓦斯等级设置得分
        switch (gasLevel) {
            case 1: // 煤与瓦斯突出矿井
                result = 0.7f;
                break;
            case 2: // 高瓦斯矿井
                result = 0.75f;
                break;
            case 3: // 瓦斯矿井
                result = 1.0f;
                break;
            default:
                // 如果传入无效值，默认返回 0
                result = 0.0f;
                break;
        }

        return result * 100;
    }

    /**
     * 计算应急管理措施得分
     *
     * @param emergencyManagement 应急管理措施（整数，1 表示完善，0 表示不完善）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getEmergencyManagementScores(int emergencyManagement) {
        float result = 0.0f;

        // 如果应急管理措施完善，则返回 100
        if (emergencyManagement == 1) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算安全投入兑现率得分
     *
     * @param overcomePercent 安全投入兑现率（浮点数，范围 0 到 100）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getInvestmentOvercomePercentScores(float overcomePercent) {
        float result = 0.0f;

        // 如果安全投入兑现率为 100，则返回 100
        if (overcomePercent == 100.0f) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算安全文化宣传与构建得分
     *
     * @param safetyCulture 安全文化宣传与构建（整数，1 表示完善，0 表示不完善）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getSafetyCultureScores(int safetyCulture) {
        float result = 0.0f;

        // 如果安全文化宣传与构建完善，则返回 100
        if (safetyCulture == 1) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算安全监管机制得分
     *
     * @param supervised 安全监管机制（整数，1 表示完善，0 表示不完善）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getSafetySupervisedMechanismScores(int supervised) {
        float result = 0.0f;

        // 如果安全监管机制完善，则返回 100
        if (supervised == 1) {
            result = 1.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯事故得分
     *
     * @param accidentCount 瓦斯事故次数（整数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasAccidentCountScores(int accidentCount) {
        float result = 1.0f;

        // 如果瓦斯事故次数大于 0，则返回 0
        if (accidentCount > 0) {
            result = 0.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯浓度监测超限次数得分
     *
     * @param overlimitCount 瓦斯浓度监测超限次数（整数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasOverlimitCountScores(int overlimitCount) {
        float result = 1.0f;

        // 如果瓦斯浓度监测超限次数大于 0，则返回 0
        if (overlimitCount > 0) {
            result = 0.0f;
        }

        return result * 100;
    }

    /**
     * 计算瓦斯浓度超限未处理次数得分
     *
     * @param undoneCount 瓦斯浓度超限未处理次数（整数）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getGasOverlimitUndoneCountScores(int undoneCount) {
        float result = 1.0f;

        // 如果瓦斯浓度超限未处理次数大于 0，则返回 0
        if (undoneCount > 0) {
            result = 0.0f;
        }

        return result * 100;
    }

    /**
     * 计算煤矿安全生产标准化等级得分
     *
     * @param safetyLevel 安全生产标准化等级（整数，1 表示一级，2 表示二级，3 表示三级，4 表示未评定）
     * @return 得分（浮点数，范围为 0 到 100）
     */
    public static float getMineSafetyLevelScores(int safetyLevel) {
        float result = 0.0f;

        // 根据安全生产标准化等级设置得分
        switch (safetyLevel) {
            case 1: // 一级
                result = 1.0f;
                break;
            case 2: // 二级
                result = 0.85f;
                break;
            case 3: // 三级
                result = 0.75f;
                break;
            case 4: // 未评定
                result = 0.59f;
                break;
            default: // 无效输入，默认返回 0
                result = 0.0f;
                break;
        }

        return result * 100;
    }


}
